package toepen;

import java.util.LinkedList;

// <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
// #[regen=yes,id=DCE.FA228014-33B7-CD3C-921D-C4BBCE421EC7]
// </editor-fold>
/**
 * Een spel is een aantal spelrondes wat gespeeld wordt, waarna uiteindelijk
 * een winnaar voort komt die als enige niet over de strafpuntlimiet heen is
 * @author LucasD
 */
public class Spel {

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.E8E39A8B-B38D-8304-7738-A707B5CE03E0]
    // </editor-fold>
    /**
     * De actuele spelronde die op dit moment gespeeld wordt. Op het moment dat
     * deze voorbij is verdwijnt deze weer.
     */
    private SpelRonde spelRonde;
    private Deelnemer winnaar;
    private boolean spelAfgelopen;

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.7257F641-BF30-D018-40BE-4BFACF12FC7A]
    // </editor-fold>
    /**
     * De lijst met deelnemers aan het spel. Iedereen die stop met het spelen
     * van het spel wordt uit deze lijst gehaald.
     */
    private LinkedList<Deelnemer> deelnemers;

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.BF30CE07-E4D3-54AA-9C88-578964D2E280]
    // </editor-fold>
    /**
     * Gestarte spellen kunnen niet meer gejoind worden
     */
    private boolean isGestart;

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.08612081-4A2C-8EF5-DD1A-68EEA501C983]
    // </editor-fold>
    /**
     * Minimum aantal spelers voordat het spel gestart mag worden
     */
    private int minimumSpelers;

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.44F78A17-0E58-6D55-4239-CA63C021E083]
    // </editor-fold>
    /**
     * Maximum aantal spelers wat zich mag aanmelden voor dit spel
     */
    private int maximumSpelers;

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.7686CD18-CD72-FB58-EBEC-5B6CEC4C52E7]
    // </editor-fold>
    /**
     * Het aantal strafpunten waar een speler onder moet blijven zitten
     */
    private int strafpuntLimiet;

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.9147845A-6110-A503-798A-358F6023C7B9]
    // </editor-fold>
    /**
     * Vuile wasregel actief
     */
    private boolean isVuileWasToegestaan;

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.E348E593-3436-B1CB-29FC-75CD158AEE05]
    // </editor-fold>
    /**
     * Verplicht kloppen en beginnen als je nog maar een strafpunt kan krijgen
     */
    private boolean isArmoedeVerplicht;

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.7FB50FFE-872F-A11D-5B50-59E2B0428F5C]
    // </editor-fold>
    /**
     * Vijfkruizenregel actief
     */
    private boolean isVijfKruizenRegel;

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.96A28B52-A152-922B-3366-0ADD380E29CE]
    // </editor-fold>
    /**
     * Of het mogelijk is om de inzet te verhogen door middel van kloppen
     */
    private boolean isKloppenToegestaan;

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.71E8D018-B83B-74F7-3415-EC41990CCD6B]
    // </editor-fold>
    /**
     * Blind kloppen regel in of uit schakelen
     */
    private boolean isBlindKloppenToegestaan;

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.F183515A-20A6-B0F3-8897-9887F28E82A2]
    // </editor-fold>
    /**
     * Naam van het spel
     */
    private String naam;

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.DE4BAD70-9210-DD0A-D4B4-2BFBB942B45C]
    // </editor-fold>
    /**
     * Het password moet opgegeven worden tijdens het aanloggen als deze niet
     * leeg is
     */
    private String password;

    private Deelnemer spelHost;

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.D140BF92-9CC2-D3C7-CACB-063E74955FBB]
    // </editor-fold> 
    private boolean isValseVuileWasToegestaan;

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.169F3EC3-8D7D-CB46-CF15-663CE8B7C03B]
    // </editor-fold> 
    /**
     * Constructor voor Spel. Alle deelnemers, regels en instellingen worden
     * direct bij initialisatie meegegeven
     * @param naam spelnaam
     * @param password wachtwoord om deel te nemen
     * @param spelHost Deelnemer die het spel host
     * @param deelnemers
     * @param minimumSpelers
     * @param maximumSpelers
     * @param strafpuntLimiet
     * @param isVuileWasToegestaan
     * @param isArmoedeVerplicht
     * @param isKloppenToegestaan
     * @param isBlindKloppenToegestaan
     */
    public Spel(
            String naam,
            String password,
            Deelnemer spelHost,
            LinkedList<Deelnemer> deelnemers,
            int minimumSpelers,
            int maximumSpelers,
            int strafpuntLimiet,
            boolean isVuileWasToegestaan,
            boolean isArmoedeVerplicht,
            boolean isKloppenToegestaan,
            boolean isBlindKloppenToegestaan)
    {
        this.naam = naam;
        this.password = password;
        this.spelHost  = spelHost;
        this.deelnemers=deelnemers;
        this.isGestart = false;
        this.minimumSpelers = minimumSpelers; 
        this.maximumSpelers = maximumSpelers;
        this.strafpuntLimiet = strafpuntLimiet;
        this.isVuileWasToegestaan = isVuileWasToegestaan;
        this.isArmoedeVerplicht = isArmoedeVerplicht;
        this.isKloppenToegestaan = isKloppenToegestaan;
        this.isBlindKloppenToegestaan = isBlindKloppenToegestaan;

        Deelnemer winnaar = spelHost;
        int rondenr=1;
        int aantalActief=0;

        for (int i=0;i<this.deelnemers.size();i++){
            if (deelnemers.get(i).getStrafPunten()>=this.strafpuntLimiet){
                deelnemers.get(i).setInactief();
            }
            else {
                aantalActief++;
            }
        }
        if (aantalActief<2){
           eindeSpel(null);
        }
        else{

         spelRonde = new SpelRonde(this,rondenr,winnaar);
        }
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.9B394A71-6CC5-730C-09B5-7E2F3211EF6E]
    // </editor-fold> 
    /**
     *
     * @return Lijst met deelnemers
     */
    public LinkedList<Deelnemer> getDeelnemers() {
        return deelnemers;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.D9455CB8-4675-28A7-988B-5CB101E2EFE7]
    // </editor-fold> 
    /**
     * Armoede regel verplicht
     * @return is armoede verplicht
     */
    public boolean getIsArmoedeVerplicht() {
        return isArmoedeVerplicht;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.50C0094D-F651-98FC-9434-BC1C66163285]
    // </editor-fold> 
    /**
     * Blind kloppen regel
     * @return of blind kloppen toegestaan is
     */
    public boolean getIsBlindKloppenToegestaan() {
        return isBlindKloppenToegestaan;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.5724F152-D9E0-1BF6-3D76-FBEC01EE8432]
    // </editor-fold> 
    /**
     * @return of het spel gestart is
     */
    public boolean getIsGestart() {
        return isGestart;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.ED3E9CA3-C2FA-750F-5EAB-FCA8AE169AB6]
    // </editor-fold> 
    /**
     * @return of het toegestaan is te kloppen
     */
    public boolean getIsKloppenToegestaan() {
        return isKloppenToegestaan;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.C9594514-75FA-951B-B47A-69486DA7295A]
    // </editor-fold>
    /**
     * @return of het toegestaan is valse vuile was te claimen
     */
    public boolean getIsValseVuileWasToegestaan () {
        return isValseVuileWasToegestaan;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.126A6961-959C-6434-6099-BE28BA858CB1]
    // </editor-fold>
    /**
     * @return of de vijfkruizenregel is ingesteld
     */
    public boolean getIsVijfKruizenRegel () {
        return isVijfKruizenRegel;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.B6BB5AB6-79AC-ECC8-D814-D3A1B44C0F93]
    // </editor-fold>
    /**
     * @return of het toegestaan is vuile was te claimen
     */
    public boolean getIsVuileWasToegestaan () {
        return isVuileWasToegestaan;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.C9A94E15-6DCE-5319-DBB0-6B9DBA7ECAA7]
    // </editor-fold>
    /**
     * @return maximum aantal spelers voor dit spel
     */
    public int getMaximumSpelers () {
        return maximumSpelers;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.707FA572-7743-6E7F-CB87-C0FC18D6010E]
    // </editor-fold>
    /**
     * @return maximum aantal strafpunten voor dit spel
     */
    public int getStrafpuntLimiet () {
        return strafpuntLimiet;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.576B7C28-8835-1EA4-4119-A26862FB80AC]
    // </editor-fold>
    /**
     * @return minimum aantal spelers
     */
    public int getMinimumSpelers () {
        return minimumSpelers;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.D4E7B084-135D-1CFE-47E3-CA387C214DD5]
    // </editor-fold>
    /**
     * @return naam van dit spel
     */
    public String getNaam () {
        return naam;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.7EDAA7C5-4EA1-3764-DE97-486841BB18CE]
    // </editor-fold>
    /**
     * @return password van dit spel
     */
    public String getPassword () {
        return password;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.BAAB8D20-84F9-6C75-C6E7-61762AB8F248]
    // </editor-fold>
    /**
     * @return huidige spelronde van dit spel
     */
    public SpelRonde getSpelRonde () {
        return spelRonde;
    }

    /**
     * @return deelnemer die het spel host
     */
    public Deelnemer getSpelHost () {
        return spelHost;
    }

    /**
     * Einde spel sequentie met winnaar
     * @param winnaar Deelnemer die het spel heeft gewonnen
     */
    public void eindeSpel(Deelnemer winnaar){
        this.winnaar = winnaar;
        spelAfgelopen = true;
    }

    /**
     * Einde spel sequentie zonder winnaar
     */
    public void eindeSpel(){
        this.winnaar = null;
        spelAfgelopen = true;
    }

    /**
     * @return winnaar van het spel
     */
    public Deelnemer getWinnaar() {
        return winnaar;
    }

    /**
     * @return of het spel afgelopen is
     */
    public boolean isSpelAfgelopen() {
        return spelAfgelopen;
    }
}

